import argparse
import logging
import os
import sys

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.StreamHandler(),
        logging.FileHandler('veritasgene.log', encoding='utf-8')
    ]
)
logger = logging.getLogger(__name__)

# 导入tools文件夹中的模块
from tools.opentargets import (
    opentargets_disease_associations,
    opentargets_disease_drugs,
    opentargets_target_associations
)
from tools.pubmed import pubmed_search


def main():
    """主函数，提供命令行接口"""
    parser = argparse.ArgumentParser(
        description='VeritasGene - 整合OpenTargets和PubMed查询功能的生物信息学工具集'
    )
    subparsers = parser.add_subparsers(dest='command', help='可用命令')
    
    # OpenTargets查询子命令
    ot_subparsers = subparsers.add_parser('opentargets', help='OpenTargets查询功能')
    ot_subparsers = ot_subparsers.add_subparsers(dest='ot_command', help='OpenTargets查询类型')
    
    # 疾病药物查询
    ot_disease_drugs_parser = ot_subparsers.add_parser(
        'disease-drugs', help='查询疾病相关药物'
    )
    ot_disease_drugs_parser.add_argument('--disease-name', type=str, help='疾病名称')
    ot_disease_drugs_parser.add_argument('--disease-id', type=str, help='疾病ID (EFO ID)')
    ot_disease_drugs_parser.add_argument(
        '--limit', type=int, default=100, help='返回结果数量限制 (默认: 100)'
    )
    ot_disease_drugs_parser.add_argument(
        '--format', 
        type=str, 
        default='all', 
        choices=['json', 'csv', 'all'], 
        help='输出格式 (默认: all)'
    )
    ot_disease_drugs_parser.add_argument(
        '--non-interactive', 
        action='store_true', 
        help='非交互式模式，当有多个疾病匹配时自动选择第一个'
    )
    ot_disease_drugs_parser.add_argument(
        '--config', type=str, default='config.ini', help='配置文件路径'
    )
    ot_disease_drugs_parser.set_defaults(func=opentargets_disease_drugs)
    
    # 基因关联疾病查询
    ot_target_associations_parser = ot_subparsers.add_parser(
        'target-associations', help='查询基因关联疾病'
    )
    ot_target_associations_parser.add_argument(
        '--gene-name', type=str, required=True, help='基因名称'
    )
    ot_target_associations_parser.add_argument(
        '--limit', type=int, default=100, help='返回结果数量限制 (默认: 100)'
    )
    ot_target_associations_parser.add_argument(
        '--format', 
        type=str, 
        default='all', 
        choices=['json', 'csv', 'all'], 
        help='输出格式 (默认: all)'
    )
    ot_target_associations_parser.add_argument(
        '--config', type=str, default='config.ini', help='配置文件路径'
    )
    ot_target_associations_parser.set_defaults(func=opentargets_target_associations)
    
    # 疾病关联靶点查询
    ot_disease_associations_parser = ot_subparsers.add_parser(
        'disease-associations', help='查询疾病关联靶点'
    )
    ot_disease_associations_parser.add_argument('--disease-name', type=str, help='疾病名称')
    ot_disease_associations_parser.add_argument('--disease-id', type=str, help='疾病ID (EFO ID)')
    ot_disease_associations_parser.add_argument(
        '--limit', type=int, default=100, help='返回结果数量限制 (默认: 100)'
    )
    ot_disease_associations_parser.add_argument(
        '--format', 
        type=str, 
        default='all', 
        choices=['json', 'csv', 'all'], 
        help='输出格式 (默认: all)'
    )
    ot_disease_associations_parser.add_argument(
        '--non-interactive', 
        action='store_true', 
        help='非交互式模式，当有多个疾病匹配时自动选择第一个'
    )
    ot_disease_associations_parser.add_argument(
        '--config', type=str, default='config.ini', help='配置文件路径'
    )
    ot_disease_associations_parser.set_defaults(func=opentargets_disease_associations)
    
    # PubMed搜索子命令
    pubmed_parser = subparsers.add_parser('pubmed', help='PubMed搜索功能')
    pubmed_parser.add_argument(
        '--query', type=str, required=True, help='搜索关键词'
    )
    pubmed_parser.add_argument(
        '--limit', type=int, default=100, help='返回结果数量限制 (默认: 100)'
    )
    pubmed_parser.add_argument(
        '--format', 
        type=str, 
        default='all', 
        choices=['json', 'all'], 
        help='输出格式 (默认: all)'
    )
    pubmed_parser.add_argument(
        '--config', type=str, default='config.ini', help='配置文件路径'
    )
    pubmed_parser.set_defaults(func=pubmed_search)
    
    # 如果没有提供参数，显示帮助信息
    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(1)
    
    args = parser.parse_args()
    args.func(args)


if __name__ == "__main__":
    main()